package br.com.appclassificados.dao;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;

import br.com.appclassificados.helpers.ConnectionFactory;
import br.com.appclassificados.model.Pessoa;

public class PessoaDao implements CRUD<Pessoa> {
	
    private Connection con;
    private PreparedStatement ps = null;
    private ResultSet rs = null;  	
	
	public PessoaDao(){
		this.con = ConnectionFactory.getConnection().getConn();
	}

	//Reconstruido com Exito, 01:40, 22/10/2013, Eduardo
	//Acrescimo do campo 'digest'ao insert
	@Override
	public boolean insert(Pessoa obj) {
		try{
            PreparedStatement ps = this.con.prepareStatement("insert into pessoa " +
            					"(pessoaid, nome, fone, email, nascimento, digest)" +
            					"values (?, ?, ?, ?, ?, ?)");
            ps.setInt(1, getChave());
            ps.setString(2, obj.getNome());
            ps.setString(3, obj.getFone());
            ps.setString(4, obj.getEmail());
            ps.setString(5, new SimpleDateFormat("yyyy/MM/dd").format(obj.getNascimento()));
            ps.setString(6, obj.getDigest());
            ps.execute();
            ps.close();
            this.con.close();                         
            return true;            
        }catch(Exception e){
            return false;
        }   
	}

	//Testado com Exito, 16:25, 19/10/2013, Maicon D.
	//Corrigido query: tava id, certo pessoaid.
	@Override
	public boolean delete(Pessoa obj) {
		try{
            PreparedStatement ps = this.con.prepareStatement("delete from pessoa where pessoaid = ?");
            ps.setInt(1, obj.getId());
            ps.executeUpdate();
            ps.close();
            this.con.close();                         
            return true;            
        }catch(Exception e){
            return false;
        } 
	}

	//Testado com Exito, 16:25, 19/10/2013, Maicon D.
	//Corrigido falta do nascimento na query
	@Override
	public boolean update(Pessoa obj) {
		try{
            PreparedStatement ps = this.con.prepareStatement("update pessoa "
            		+ "set nome = ? , fone = ? , email = ?, nascimento = ? where pessoaid = ?");            
            ps.setString(1, obj.getNome());
            ps.setString(2, obj.getFone());
            ps.setString(3, obj.getEmail());
            ps.setString(4, new SimpleDateFormat("yyyy/MM/dd").format(obj.getNascimento()));
            ps.setInt(5, obj.getId());
            ps.executeUpdate();
            ps.close();
            this.con.close();                         
            return true;            
        }catch(Exception e){
            return false;
        }
	}

	//Testado com Exito, 16:25, 19/10/2013, Maicon D.
	@Override
	public Pessoa search(int id) {
		try{
            PreparedStatement ps = this.con.prepareStatement("select pessoaid, nome, fone, email, nascimento from pessoa where pessoaid = ?");
            
            ps.setInt(1, id);
            this.rs = ps.executeQuery();
            
            if(this.rs.next()){
                Pessoa p = new Pessoa(id, this.rs.getString("nome"),
                						  this.rs.getString("email"),
                						  this.rs.getString("fone"),
                						  this.rs.getDate("nascimento"));
                
                return p;
                
            }else
                return null;
        }catch(Exception e){
            return null;
        }
	}

	//Testado com Exito, 16:25, 19/10/2013, Maicon D.
	@Override
	public Pessoa search(String value) {
		 try{
	         PreparedStatement ps = this.con.prepareStatement("select pessoaid, nome, fone, email, nascimento from pessoa where upper(nome) like ?");                        
	         ps.setString(1, "%"+value.toUpperCase()+"%");
	         this.rs = ps.executeQuery();
	            
	         if(this.rs.next()){
	             Pessoa p = new Pessoa(this.rs.getInt("pessoaid"),
	            		 			   this.rs.getString("nome"),
	            		 			   this.rs.getString("fone"),
	            		 			   this.rs.getString("email"),
	            		 			   this.rs.getDate("nascimento"));
	             return p;
	         }else
	        	 return null;
	     }catch(Exception e){
	    	 return null;
	     }
	}
	
	//Testado com Exito, 16:25, 19/10/2013, Maicon D.
	@Override
	public List<Pessoa> readList() {
		try{
            PreparedStatement ps = this.con.prepareStatement("select pessoaid, nome, fone, email, nascimento, digest from pessoa");                                    
            this.rs = ps.executeQuery();            
            
            List<Pessoa> lp = new ArrayList<Pessoa>();
            
            while(this.rs.next()){
                Pessoa p = new Pessoa(this.rs.getInt("pessoaid"),
                					  this.rs.getString("nome"),
                					  this.rs.getString("fone"),
                					  this.rs.getString("email"),
                					  this.rs.getDate("nascimento"),
                					  this.rs.getString("digest"));
                
                lp.add(p);
            }
            
            return lp;
        }catch(Exception e){
            return null;
        }
	}	

	@Override
	public int getChave() {
		try{
	         PreparedStatement ps = this.con.prepareStatement("select max(pessoaid) from pessoa");                        
	         this.rs = ps.executeQuery();
	            
	         if(this.rs.next()){
	        	 return (this.rs.getInt("max(pessoaid)") + 1);
	         }else
	        	 return 0;
	     }catch(Exception e){
	    	 return 0;
	     }
	}
}
